跳到主要内容

数据准备

缺失值

数据集由于各种原因可能包含缺失值或空记录,通常以空白或 NaN 编码。大多数机器学习算法无法处理缺失或空白的值。删除包含缺失值的样本是一种有时会使用的基本策略,但代价是可能丢失有价值的数据及其关联的信息或模式。更好的策略是对缺失值进行插补(imputation/fill)。

参数

imputation_type: string, default = simple
要使用的插补类型。可以是 simpleiterative。If None, no imputation of missing values is performed.

numeric_imputation: int, float, or string, default = mean
数值列的插补策略。当 imputation_type= iterative 时被忽略。可选项包括:

drop: 删除包含缺失值的行。 mean: 用列的均值填充。 median: 用列的中位数填充。 mode: 用最频繁出现的值填充。 knn: 使用 K-Nearest Neighbors 方法进行插补。 int 或 float: 使用提供的数值进行填充。

categorical_imputation: string, default = mode
类别列的插补策略。当 imputation_type= iterative 时被忽略。可选项包括:

drop: 删除包含缺失值的行。 mode: 用最频繁出现的值填充。 str: 使用提供的字符串进行填充。

iterative_imputation_iters: int, default = 5
迭代次数。当 imputation_type=simple 时被忽略。

numeric_iterative_imputer: str or sklearn estimator, default = lightgbm
用于数值特征迭代插补的回归器。如果为 None,则使用 LGBClassifier。当 imputation_type=simple 时被忽略。

categorical_iterative_imputer: str or sklearn estimator, default = lightgbm
用于类别特征迭代插补的回归器。如果为 None,则使用 LGBClassifier。当 imputation_type=simple 时被忽略。

示例

# load dataset
from pycaret.datasets import get_data
hepatitis = get_data('hepatitis')

# init setup
from pycaret.classification import
clf1 = setup(data = hepatitis, target = 'Class')

Before

After

Simple imputer 与 Iterative imputer 的比较

如需了解更多该实验的信息,请阅读 这篇文章

数据类型

数据集中每个特征都有一个相关联的数据类型,例如数值型、类别型或 Datetime。PyCaret 的推断算法会自动检测每个特征的数据类型。但有时 PyCaret 推断的数据类型不正确。确保数据类型正确很重要,因为若干下游流程依赖于特征的数据类型。例如,对于数值型和类别型特征,缺失值 的填充方式可能不同。要覆盖推断出数据类型,可以在 setup 函数中使用 numeric_featurescategorical_featuresdate_features 参数。你也可以使用 ignore_features 在模型训练时忽略某些特征。

参数

numeric_features: list of string, default = None
如果推断的数据类型不正确,可以使用 numeric_features 覆盖推断结果。

categorical_features: list of string, default = None
如果推断的数据类型不正确,可以使用 categorical_features 覆盖推断结果。

date_features: list of string, default = None
如果数据中有一个 Datetime 列在运行 setup 时未被自动识别,可以使用 date_features 强制指定其数据类型。它可以处理多个日期列。与日期时间相关的特征不会直接用于建模,而是会进行特征提取,原始的 Datetime 列在模型训练过程中会被忽略。如果 Datetime 列包含时间戳,还会提取与时间相关的特征。

create_date_columns: list of str, default = ["day", "month", "year"]
从日期特征创建的列。注意,创建后方差为零的特征(例如仅包含日期的列中的 hour 特征)会被忽略。允许的值为 pandas.Series.dt 的日期时间属性。特征的日期时间格式会从第一个非 NaN 值自动推断。

text_features: list of str, default = None
包含文本语料的列名。如果为 None,则不选择文本特征。

text_features_method: str, default = 'tf-idf'
将文本特征嵌入数据集的方法。可在 'bow'(Bag of Words - CountVectorizer)和 'tf-idf'(TfidfVectorizer)之间选择。请注意,转换器输出的稀疏矩阵会在内部转换为完整数组,对于大规模文本嵌入可能导致内存问题。

ignore_features: list of string, default = None
ignore_features 可用于在模型训练时忽略特定特征。它接受一个包含要忽略列名的字符串列表。

keep_features: list of str, default = None
keep_features 参数可用于在预处理期间始终保留特定特征,即这些特征不会被任何形式的特征选择删除。它接受一个包含要保留列名的字符串列表。

示例 1 - 类别特征

# load dataset
from pycaret.datasets import get_data
hepatitis = get_data('hepatitis')

# init setup
from pycaret.classification import
clf1 = setup(data = hepatitis, target = 'Class', categorical_features = ['AGE'])

之前

之后

示例 2 - 忽略特征

# load dataset
from pycaret.datasets import get_data
pokemon = get_data('pokemon')

# init setup
from pycaret.classification import
clf1 = setup(data = pokemon, target = 'Legendary', ignore_features = ['#', 'Name'])

之前

之后

独热编码

数据集中的分类特征包含标签值(有序或无序),而不是连续数值。大多数机器学习算法无法直接处理分类特征,因此在训练模型之前必须将其转换为数值。最常见的分类编码类型是独热编码(也称为 dummy encoding),每个类别水平都会成为数据集中的一个单独特征,包含二进制值(1 或 0)。

由于这是执行机器学习实验的必要步骤,PyCaret 会将数据集中的所有分类特征转换为独热编码。这对于具有名义分类数据(即无法排序的数据)的特征最为理想。在其他不同场景下,应使用其他编码方法。例如,当数据是有序的(即数据具有内在层级)时,必须使用 序数编码。独热编码适用于所有被推断为分类的特征,或在 setup 函数中使用 categorical_features 强制指定为分类的特征。

参数

max_encoding_ohe: int, default = 25
唯一值数量小于或等于 max_encoding_ohe 的分类列使用独热编码。若更多,则使用 encoding_method 指定的估计器。注意,恰好有两个类别的列始终以序数方式编码。将其设置为小于 0 可始终使用独热编码。

encoding_method: category-encoders 估计器,default = None
用于对唯一值多于 max_encoding_ohe 的分类列进行编码的 category-encoders 估计器。若为 None,默认使用 category_encoders.leave_one_out.LeaveOneOutEncoder

# load dataset
from pycaret.datasets import get_data
pokemon = get_data('pokemon')

# init setup
from pycaret.classification import
clf1 = setup(data = pokemon, target = 'Legendary')

之前

之后

序数编码

当数据集中的类别特征包含具有内在自然顺序的变量(例如 低、中、高)时,这些特征必须与名义变量(例如男性或女性,没有内在顺序)采用不同的编码方式。可以在 setup 函数中使用 ordinal_features 参数来实现,该参数接受一个字典,字典包含特征名和按从最低到最高的升序排列的级别。

参数

ordinal_features: dictionary, default = None
当数据包含有序特征时,必须使用 ordinal_features 进行不同的编码。如果数据有一个类别变量,其取值为 lowmediumhigh,且已知 low < medium < high,那么可以传入 ordinal_features = { 'column_name' : ['low', 'medium', 'high'] }。列表顺序必须按从最低到最高排列。

示例

# load dataset
from pycaret.datasets import get_data
employee = get_data('employee')

# init setup
from pycaret.classification import
clf1 = setup(data = employee, target = 'left', ordinal_features = {'salary' : ['low', 'medium', 'high']})

之前

目标类别不平衡

当训练数据集中目标类别分布不均时,可以在 setup 中使用 fix_imbalance 参数来修复。将其设置为 True 时,默认采用 SMOTE (Synthetic Minority Over-sampling Technique) 作为重采样方法。可以在 setup 中使用 fix_imbalance_method 来更改重采样方法。

参数

fix_imbalance: bool, default = False
当设置为 True 时,训练数据集会使用 fix_imbalance_method 中定义的算法进行重采样。为 None 时,默认使用 SMOTE。 fix_imbalance_method: str or imblearn estimator, default = 'SMOTE'
用于执行类别均衡的估计器。可以选择 imblearn 估计器的名称,或此类估计器的自定义实例。当 fix_imbalance=False 时忽略。

示例

# load dataset
from pycaret.datasets import get_data
credit = get_data('credit')

# init setup
from pycaret.classification import
clf1 = setup(data = credit, target = 'default', fix_imbalance = True)

SMOTE 前后对比

移除异常值

PyCaret 中的 remove_outliers 函数允许您在训练模型之前识别并移除数据集中的异常值。异常值通过 PCA 线性降维并使用奇异值分解 (Singular Value Decomposition) 技术来识别。可以在 setup 中通过 remove_outliers 参数实现。异常值的比例由 outliers_threshold 参数控制。

参数

remove_outliers: bool, default = False
当设为 True 时,使用 Isolation Forest 从训练数据中移除异常值。 outliers_method: str, default = 'iforest'
用于移除异常值的方法。当 remove_outliers=False 时忽略。可能的取值为:

iforest: 使用 sklearn 的 IsolationForest。 ee: 使用 sklearn 的 EllipticEnvelope。 lof: 使用 sklearn 的 LocalOutlierFactor。 outliers_threshold: float, default = 0.05
要从数据集中移除的异常值比例(百分比)。当 remove_outliers=False 时忽略。

示例

# load dataset
from pycaret.datasets import get_data
insurance = get_data('insurance')

# init setup
from pycaret.regression import
reg1 = setup(data = insurance, target = 'charges', remove_outliers = True)

删除异常值前后

上一步:数据预处理 下一步:缩放与变换

最后更新于 2 年前